package com.wangyf.jvm.c_001_class_loader;

/**
 * 测试类都是哪个类加载器加载进入的
 * 前两个为null说明是顶层的 Bootstrap类加载器，是用C++实现，所以打印出来为 null
 * 第三个是 ext包下 为 Extension 加载器
 * 第四个是 自己定义的类，相当于classpath下，为app加载器
 *
 * 类加载器层级
 * Bootstrap C++实现 所以打印出来为null
 * Extension
 * App
 * CustomerClassLoader
 * 这几个类加载器都是Launcher的内部类
 */
public class T01_ClassLoader {
    public static void main(String[] args) {
        System.out.println(String.class.getClassLoader()); // null
        System.out.println(sun.awt.SunToolkit.class.getClassLoader()); // null
        System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader()); // sun.misc.Launcher$ExtClassLoader@7f31245a ext包下
        System.out.println(T02_Test.class.getClassLoader()); // sun.misc.Launcher$AppClassLoader@18b4aac2 classpath下
        // 这里看出所有类加载器都是Bootstrap进行加载的
        System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader().getClass().getClassLoader()); // null 说明Extension是Bootstrap进行加载的
        System.out.println(T02_Test.class.getClassLoader().getClass().getClassLoader()); // null 说明App是Bootstrap进行加载的
        // 这里看出 getParent可以得到上一层级的类加载器
        System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader().getParent()); // null 说明Extension的父加载器是Bootstrap
        System.out.println(T02_Test.class.getClassLoader().getParent()); // sun.misc.Launcher$ExtClassLoader@7f31245a 说明App的父加载器是Extension
    }
}
